
/**********************************************************************************\
** 文件名称: HCSR04.c
** 创建人员: YCG
** 创建日期: 2018-12-14
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "HCSR04.h"
#include "beep.h"
#include "systime.h"
static uint16_t Distance = 0;
 numctrl_t HCNum[1];
/*******************************************************************************
** 函数名称: ReadDistance
** 功能描述: 读取距离
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-17
********************************************************************************/
uint16_t ReadDistance(void) {
    return Distance;
}

/*******************************************************************************
** 函数名称: HCSR04Init
** 功能描述:
** 参数说明: count: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-15
********************************************************************************/
void HCSR04Init(void) {
    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = TRIG_Pin;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
    LL_GPIO_Init(TRIG_GPIO_Port, &GPIO_InitStruct);

    LL_TIM_EnableIT_CC1(HCSR_TIME);          //使能通道中断
    LL_TIM_CC_EnableChannel(HCSR_TIME, LL_TIM_CHANNEL_CH1);   //使能通道1
    LL_TIM_EnableIT_UPDATE(HCSR_TIME);       //使能计数器更新中断
    LL_TIM_SetPrescaler(HCSR_TIME, 47);         //以1us计时
    LL_TIM_SetAutoReload(HCSR_TIME, 60000 - 1); //设置定时器的更新值50ms
    LL_TIM_EnableCounter(HCSR_TIME);            //打开计数器开始计数
		NumInit(HCNum,2,5,40);
    HCSR04_Printf("%s\r\n", __FUNCTION__);

}

/*******************************************************************************
** 函数名称: HCSR04_IRQHandler
** 功能描述: 中断处理程序
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-17
********************************************************************************/
void HCSR04_IRQHandler(void) {

    static uint8_t HcState = 0;               //用来保存当前的状态
    static uint16_t RisingEdgeCount = 0;      //用来纪录上升沿时刻的比较值


    if(LL_TIM_IsActiveFlag_UPDATE(HCSR_TIME)) {           //更新中断
        LL_GPIO_SetOutputPin(TRIG_GPIO_Port, TRIG_Pin);    //设置起始信号
        LL_TIM_ClearFlag_UPDATE(HCSR_TIME);               //清除更新中断标志位
        LL_TIM_ClearFlag_CC1(HCSR_TIME);                  //清除通道1中断标志位
        for(uint16_t t = 0; t < 50; t++) {} //延时10us
        HcState = HCSR_WAIT_RISING;		    //设置状态为等待上升沿
    }

    if(LL_TIM_IsActiveFlag_CC1(HCSR_TIME)) {        //比较中断
        LL_TIM_ClearFlag_CC1(HCSR_TIME);            //清除中断标志位
        if( LL_GPIO_ReadInputPort(ECH0_GPIO_Port)&ECH0_Pin ) { //如果引脚时高电平，则是上升沿触发

            if(HcState == HCSR_WAIT_RISING) {     //如果状态为等待上升沿
                RisingEdgeCount =  LL_TIM_IC_GetCaptureCH1(HCSR_TIME);
                // HCSR04_Printf("上升沿：%d\r\n",RisingEdgeCount);
                HcState = HCSR_WAIT_FALLING;  		      //设置状态为等待下降沿
            }
        } else {                                //下降沿触发
            if(HcState == HCSR_WAIT_FALLING) {     //如果状态为等待下降沿
                Distance = (LL_TIM_IC_GetCaptureCH1(HCSR_TIME) - RisingEdgeCount) / 58;
							  HCSR04_Printf("Distance:%d\r\n", Distance);
							  //if(Distance<HCNum->num){}
                HcState = HCSR_WAIT_TRIG;  		     //设置状态为等待上升沿
            }
        }
    }
    LL_GPIO_ResetOutputPin(TRIG_GPIO_Port, TRIG_Pin);    //将中断的时间算进触发信号，节省时间
}


//float Filter(float const indat) {
//    static uint8_t state = 0;
//    static float const gap = 50;
//    static float dat1 = 0;
//    static float dat2 = 0;
//    static float dat3 = 0;
//    float outdat = 0;
//    switch(state) {
//    case 0:
//        outdat = dat1 = indat;
//        state = 1;
//        break;

//    case 1:
//        dat2 = indat;
//        if(FloatAbs(dat2 - dat1) <= gap) {
//            dat1 = dat2;          //符合要求，更新dat1的值
//            state = 1;						      //状态保持不变
//        } else {
//            state = 2;	          	    //进去下一个状态进行判断
//        }
//        break;
//    case 2:
//        dat3 = indat;               //获取新的一次采样
//        if(FloatAbs(dat3 - dat1) <= gap) {
//            dat1 = dat3;
//            state = 1;
//        } else  if(FloatAbs(dat3 - dat2) <= gap) {
//            dat1 = dat3;
//            state = 3;
//        } else	{
//            outdat = dat1 = (dat3 + dat2) / 2;
//            state = 1;
//        }
//        break;
//    case 3:
//        if(FloatAbs(indat - dat1) <= gap) {
//            dat1 = indat;
//        } else {
//            dat1 = (dat2 + dat3 + indat) / 3;
//        }
//        state = 1;
//        break;
//    }
//		return dat1;
//}
/********************************End of File************************************/

